package Modelo;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;

import javax.swing.JPopupMenu.Separator;

import DAO.DAO_Almacenar;

/**
 * Limpieza y filtrado de Datos.
 * Esta clase llega a cabo cada uno de los procesos de captura y limpieza
 * de los Datos para presentarlos al Usuario del Sistema.
 * @author William Andres Castrillon
 * @version 1.0 15/09/2012
 */
public class Scanear {	
	
	private String[][] matriz;
	
	private DAO_Almacenar miDao_Almacenar;
	
	/**
	 * Obtener Datos.
	 * Este metodo permite capturar y limpiar los datos numericos de la Url 
	 * que le llega como parametro. 
	 * @param Url valida para la captura de los Datos.
	 * @return Una matriz de String con los datos. 
	 * @throws IOException en caso de que la Url no sea de un formato valido.
	 */	
	public String[][] capturarDatos(String Url) throws IOException 
	{
		String html = getContent(Url);
	    String text = getText(html, "<", ">");
	    
	    String linea="";
		String cadena="";
		int filas=0;
			     
		//Se utilizan diferentes bucles para el filtrado de los Datos de la pagina Web.
        for (String s : text.split(System.getProperty("line.separator"))) {
        	s = s.trim();
            if (!s.isEmpty()) 
            {
                linea=s.trim().replace(
                        "&nbsp;", " ").replace(
                        "&quot;", "\"").replace(
                        "&#40;", "(").replace(
                        "&#41;", ")").replace(
                        "&#123;", "{").replace(
                        "&#125;", "}").replace(
                        "&#91;", "[").replace(
                        "&#93;", "]");
                if(Character.isDigit(linea.charAt(0)))
                {
                	cadena+=linea+";";
                }
            }
        }
        cadena=cadena.replace("-",";");
        String[] datos = cadena.split(";");
        filas= datos.length/3;
        matriz= new String[filas][3];
                
        //Llena la matriz con datos validos (numericos);
        for (int i = 0; i < datos.length; i++) {
        	for (int f = 0; f < filas; f++) {
        		for (int c = 0; c < 3; c++) {        			
					matriz[f][c] = datos[i];
					i++;					
				}
			}
		}
          
		return matriz;	
				
	}	
	/**
	 * Obtener contenido HTML.
	 * Permite capturar el contenido HTML de la web con todo su formato.
     * @param url direccion valida para extraer la informacion.
     * @return Un String con el contenido de la pagina.
     * @throws IOException [:S]
     */
    public static String getContent(String url) throws IOException {
        URL htmlStream = new URL(url);
        StringBuilder out = new StringBuilder();
        Reader in = new InputStreamReader(htmlStream.openStream(), "UTF-8");
        int read = 0;
        final char[] buffer = new char[0x2048];
        while ((read = in.read(buffer)) > 0) {
            out.append(buffer, 0, read);
        }
        return out.toString();
    }
    
    /**
     * Elimina las etiquetas.
     * Permite eliminar las etiquetas de la pagina Web
     * @param html String con el texto con etiquetas
     * @param openString caracter(String) que inicia la etiqueta '<'
     * @param closeString caracter(String) que cierra la etiqueta '>'
     * @return String sin etiquetas
     */
    public static String getText(String html, String openString, String closeString) {
        int indexOfOpenString = html.indexOf(openString);
        int indexOfCloseString = html.indexOf(closeString);
        if (indexOfOpenString != -1 && indexOfCloseString != -1) {
            String substring = html.substring(indexOfOpenString, indexOfCloseString + 1);
            html = getText(html.replace(substring, ""), openString, closeString);
        }
        return html;
    }    
    
    /**
     * Guardar en la BD.
     * Permite llamar la clase que almacena los Datos en la BD. 
     * @param matriz con los Datos que se almacenaran en la BD.
     */
    public void guardarRegistros (String [][] matriz){
    	try {
    	miDao_Almacenar = new DAO_Almacenar();
    	miDao_Almacenar.AlmacenarDatos(matriz);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    

}

